筆記目錄

Skip to content

Docker Compose 架設 SQL Server 權限問題解決方案

TLDR

  • SQL Server 容器啟動失敗並顯示 Access is denied 錯誤,是因為掛載的本機 Volume 目錄權限不符合容器內 mssql 使用者(UID 10001)的需求。
  • 正規解決方案是手動建立目錄結構後,將目錄擁有者變更為 10001:0
  • 執行指令:chown -R 10001:0 volumes 即可解決大多數權限問題。
  • 務必確保在啟動容器前,本機目錄結構已完整建立。
  • SQL Server 2025 映像檔中,sqlcmd 路徑已變更為 /opt/mssql-tools18/bin/sqlcmd

環境設定與問題情境

在 WSL 環境下使用 Docker Compose 架設 SQL Server 時,若直接掛載本機目錄作為 Volume,常會遇到 Access is denied 的權限錯誤。

什麼情況下會遇到這個問題:當 Docker 容器以非 root 使用者(mssql,UID 10001)執行,但本機掛載的目錄擁有者並非該 UID 時,容器無法寫入資料庫檔案。

yaml
services:
  SQL-Server:
    image: mcr.microsoft.com/mssql/server:2022-latest
    container_name: SQL-Server
    ports:
      - "1433:1433"
    volumes:
      - ./volumes/data:/var/opt/mssql/data
      - ./volumes/log:/var/opt/mssql/log
      - ./volumes/backup:/var/opt/mssql/backup
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "YourStrongPassword123!"

WARNING

在 SQL Server 2025 映像檔中,sqlcmd 的路徑已從 /opt/mssql-tools/bin/sqlcmd 變更為 /opt/mssql-tools18/bin/sqlcmd

權限拒絕錯誤分析

當容器啟動時,SQL Server 嘗試將系統資料檔案複製到掛載目錄,但因權限不足導致失敗:

bash
ERROR: BootstrapSystemDataDirectories() failure (HRESULT 0x80070005)
00:00:07.43 Server ERROR: Setup FAILED copying system data file 'C:\templatedata\master.mdf' to '/var/opt/mssql/data/master.mdf': 5(Access is denied.)

正規解決方案

為了確保資料持久化且權限正確,應採取以下步驟進行設定:

  1. 建立資料夾結構: 在執行 docker-compose up 之前,必須先確保本機目錄已存在。

    bash
    mkdir -p volumes/data volumes/log volumes/backup
  2. 設定目錄權限: 將目錄擁有者變更為容器內的 mssql 使用者(UID 10001)。

    bash
    chown -R 10001:0 volumes

TIP

實測發現大多數情況下只需要執行 chown 指令即可,無需額外調整群組權限。

  1. 啟動容器
    bash
    docker-compose up -d

權限指令詳解

若需更嚴謹的權限控制,可參考以下指令組合:

  • chgrp -R 0 volumes:將目錄及其內容的群組擁有者改為 root 群組(GID 0)。
  • chmod -R g=u volumes:將群組權限設定為與使用者權限相同。
  • chown -R 10001:0 volumes:將擁有者設為 UID 10001(mssql 使用者),群組設為 root。

透過將擁有者設為 UID 10001,SQL Server 容器即可獲得對掛載目錄的完整讀寫權限,從而解決 Access is denied 的問題。

異動歷程

  • 2025-08-24 初版文件建立。
  • 2025-11-04 補充完整操作步驟,說明需先建立子資料夾再設定權限。
  • 2026-02-05 新增權限設定簡化方案的 tip 說明,指出大多數情況下只需執行第三個指令。
  • 2026-03-16 補充 SQL Server 2025 的 mssql-tools 路徑變更資訊。